﻿using System.Collections.Generic;

namespace ComTools.Queue.Interface
{
    /// <summary>
    /// 队列处理器的接口（基本属性和方法）
    /// </summary>
    public interface IQueueProcessor
    {
        /// <summary>
        /// 获取队列中数据的总数
        /// </summary>        
        int Count { get; }

        /// <summary>
        /// 处理器是否繁忙
        /// </summary>        
        bool IsBusy { get; }

        /// <summary>
        /// 处理器是否空闲
        /// </summary>        
        bool IsIdle { get; }

        /// <summary>
        /// 处理队列数据
        /// </summary>
        void Process();

        /// <summary>
        /// 获取状态元数据信息，包含了每次处理的数据数等。详情请参见<see cref="QueueStatus"/>
        /// </summary>
        /// <returns>当前队列中的元数据信息</returns>
        QueueStatus GetStatus();
    }

    /// <summary>
    /// 队列处理的接口（泛型、扩展方法）
    /// </summary>
    /// <typeparam name="T">约束类型</typeparam>
    public interface IQueueProcessor<T> : IQueueProcessor
    {
        /// <summary>
        /// 入队
        /// </summary>
        /// <param name="item">要入队的对象</param>
        void Enqueue(T item);

        /// <summary>
        /// 出队
        /// </summary>
        /// <returns>出队的项</returns>
        T Dequeue();

        /// <summary>
        /// 出队指定数目的项
        /// </summary>
        /// <param name="numberToDequeue">指定要出队的数量</param>
        /// <returns>出队的数据集合</returns>
        IList<T> Dequeue(int numberToDequeue);
    }
}
